/**
 * @desc axios请求统一配置和处理
 */

import Vue from "vue";
import qs from "qs";
import axios from "axios";
import {Message} from "element-ui";
import Utils from "@/store/utils.js";

const options = {
  timeout: 90000,
  // 发送请求时带上cookie
  withCredentials: true,
  //设置请求头
  // headers: { 'content-type':'application/json;charset=UTF-8'},
  headers: {"content-type": "application/x-www-form-urlencoded"}
};
const Axios = axios.create(options);

// request请求拦截处理
Axios.interceptors.request.use(
  config => {
    // console.log("请求拦截config:", config);
    // 给所有get请求加时间戳
    if (config.method === "get") {
      if (config.params) {
        config.params.t = Date.now();
      } else {
        config.params = {
          t: Date.now()
        };
      }
    } else {
      // config.headers = {
      //   "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
      //   // "Content-Type": "application/json;charset=UTF-8"
      // };

      // 根据接口判断是否要加密，加密的更改请求头
      var urlNow = config.url.split("/smxc")[1];
      var urlList = [
        "/county_village/t_v/list", // 县乡村管理
        "/county_village/xxc/list",
        "/county_village/t_v/add",
        "/county_village/t_v/update",
        "/county_village/t_v/del",
        "/department/add", // 部门管理
        "/department/update",
        "/department/del",
        "/jobs/add", // 岗位管理
        "/jobs/update",
        "/jobs/del",
        "/user_role/add", // 角色管理
        "/user_role/del",
        "/user_role/update",
        "/user_role/menu/update",
        "/user/list", // 用户管理
        "/user/add",
        "/user/update",
        "/user/del",
        "/river/add", // 河道管理
        "/river/update",
        "/river/del",
        "/pond/add", // 坑塘管理
        "/pond/update",
        "/pond/del",
        "/reservoir/add", // 水库管理
        "/reservoir/update",
        "/reservoir/del",
        "/wsc/add", // 水系连通工程
        "/wsc/update",
        "/wsc/del",
        "/sewage/add", // 污水治理
        "/sewage/update",
        "/sewage/del",
        "/rec/add", // 生态治理
        "/rec/update",
        "/rec/del",
        "/pond/pro/add", // 坑塘治理
        "/pond/pro/update",
        "/pond/pro/del",
        "/grp/add", // 生态绿化-步行道
        "/grp/update",
        "/grp/del",
        "/area_upgrading/add", // 片区提升
        "/area_upgrading/update",
        "/area_upgrading/del",
        "/repair_damaged_mountain/add", // 破损山体
        "/repair_damaged_mountain/update",
        "/repair_damaged_mountain/del"
      ];
      var aurlSelect = urlList.indexOf(urlNow);
      if (aurlSelect > -1) {
        console.log(urlNow, "--加密");
        config.headers = {
          "Content-Type": "application/json;charset=UTF-8"
        };
        var aesDatas = {
          aesKey: qs.parse(config.data),
          sign: "w"
        };
        var is_datas = Utils.encrypt(JSON.stringify(aesDatas));
        var aes_datas = encodeURI(is_datas);
        config.data = aes_datas;
      } else {
        console.log(urlNow, "--不加密");
        config.headers = {
          "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
        };
      }

      // 判断是否存在token,如果存在将每个页面header添加token   config.headers.common[]
      if (sessionStorage.getItem("token")) {
        config.headers["token"] = sessionStorage.getItem("token");
      }
    }
    return config;
  },
  err =>
    // Do something with request error
    Promise.reject(err)
);

// response响应拦截处理
Axios.interceptors.response.use(
  res => {
    // console.log("响应拦截res---:", res);
    // 请求成功，但是操作不成功时显示后端返回的错误信息
    // 请求成功条件根据接口规范来设置
    /* if (!res.data.code) {
       // 统一错误处理
       // Message.error(res.data.message || '接口请求出错了！')
     }*/
    if (
      res.data.result == 102002 ||
      res.data.result == 102003 ||
      res.data.result == 102004 ||
      res.data.result == 102005
    ) {
      Message.error("站点名称重复或服务器操作失败");
      return;
    }

    // 获取路径
    let to_path = sessionStorage.getItem("to_path");
    // token失效错误跳转登录页
    if (res.data.result == 1001 || res.data.result == 1002) {
      //只要不是unity网页的都跳转到登录页
      if (to_path.indexOf("/unity") == -1) {
        Message.error(res.data.msg);
        setTimeout(function () {
          window.location.href = "/";
        }, 1000);
        return;
      }
    }

    // 根据接口判断是否要加密，加密的解密
    var urlNow = res.config.url.split("/smxc")[1];
    var urlList = [
      "/county_village/t_v/list", // 县乡村管理
      "/county_village/xxc/list",
      "/county_village/t_v/add",
      "/county_village/t_v/update",
      "/county_village/t_v/del",
      "/department/add", // 部门管理
      "/department/update",
      "/department/del",
      "/jobs/add", // 岗位管理
      "/jobs/update",
      "/jobs/del",
      "/user_role/add", // 角色管理
      "/user_role/del",
      "/user_role/update",
      "/user_role/menu/update",
      "/user/list", // 用户管理
      "/user/add",
      "/user/update",
      "/user/del",
      "/river/add", // 河道管理
      "/river/update",
      "/river/del",
      "/pond/add", // 坑塘管理
      "/pond/update",
      "/pond/del",
      "/reservoir/add", // 水库管理
      "/reservoir/update",
      "/reservoir/del",
      "/wsc/add", // 水系连通工程
      "/wsc/update",
      "/wsc/del",
      "/sewage/add", // 污水治理
      "/sewage/update",
      "/sewage/del",
      "/rec/add", // 生态治理
      "/rec/update",
      "/rec/del",
      "/pond/pro/add", // 坑塘治理
      "/pond/pro/update",
      "/pond/pro/del",
      "/grp/add", // 生态绿化-步行道
      "/grp/update",
      "/grp/del",
      "/area_upgrading/add", // 片区提升
      "/area_upgrading/update",
      "/area_upgrading/del",
      "/repair_damaged_mountain/add", // 破损山体
      "/repair_damaged_mountain/update",
      "/repair_damaged_mountain/del"
    ];
    var aurlSelect = urlList.indexOf(urlNow);
    if (aurlSelect > -1) {
      // console.log(urlNow, "--解密");
      // AES解密
      var response = JSON.parse(Utils.decrypt(res.data.data || null));
      res.data.data = response;
    } else {
      // console.log(urlNow, "--不解密");
    }

    // 统一错误处理
    if (res.data.result != 0) {
      Message.error(res.data.msg);
    }
    // 返回接口数据
    return res.data;
  },
  err => {
    console.error("err===========", err, err.response);
    if (err && err.response) {
      // 统一错误处理
      // Message.error(err.message || '接口请求出错了！')
      Message.error("数据请求失败，code = " + err.response.status);
    }
      // else if (Axios.cancel(err)) {
      //   // 处理请求被手动取消情况
      //   console.log('请求被取消')
    // }
    else {
      // 处理网络访问出错的情况
      Message.error("连接到服务器失败！");
    }

    return Promise.reject(err);
  }
);

// 将axios实例挂载到vue，方便需要时使用
// 不过推荐统一使用api.js来定义所有接口，方便统一管理维护
Vue.prototype.$axios = Axios;

export default Axios;
